// 对token的处理
import { getToken, setToken, removeToken, getTimeStamp, setTimeStamp } from '@/utils/auth'
// 登录的api
import { login, getUserInfo, getUserDetailById } from '@/api/user'
// 路由重置
import { resetRouter } from '@/router'

const state = {
  token: getToken(), //设置token为共享状态,初始化直接从缓存读取，关闭又打开页面的时候
  userInfo: {},
}
const mutations = {
  // 设置token
  setToken: function (state, token) {
    state.token = token
    // 通过vuex设置了token的值，要同步更新缓存中的token值
    setToken(token)
  },
  // 清除token
  removeToken(state) {
    state.token = null
    // 清楚了vuex中的token，也要同步清除缓存中的token
    removeToken()
  },
  // 设置值用户信息
  setUserInfo(state, value) {
    state.userInfo = value
  },
  // 删除用户信息
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
const actions = {
  // 登录，在登录页面调用这个actions,在这个actions内部再调用登录的接口，发送请求，得到请求结果
  // 成功则使用mutations更新vuex的token，失败则返回失败信息
  // 加了async表示这是一个异步函数，async标记的函数是一个Promise对象
  async login(context, data) {
    // 调用api目录下的接口，向后台发送请求，通过响应拦截器，先对数据进行处理，返回的就是成功之后的数据data
    // 这里的result就是token
    const result = await login(data)
    if (result) {
      // 如果为true表示请求成功
      // 调用mutations给token赋值
      context.commit('setToken', result)
      // 拿到token说明登录成功，存时间戳
      setTimeStamp()
    }
  },
  // 获取用户信息
  async getUserInfo(context) {
    // 获取用户信息
    const result = await getUserInfo()
    // 获取用户详情--头像
    const userDetail = await getUserDetailById(result.userId)
    const allUserInfo = { ...result, ...userDetail }
    // 提交到 mutations
    context.commit('setUserInfo', allUserInfo)
    // 给后期做权限的时候留下返回值
    return allUserInfo
  },
  // 退出登录
  logout(context) {
    // 删除token，vuex中的和缓存中的
    context.commit('removeToken')
    // 删除用户信息
    context.commit('removeUserInfo')
    // 重置路由
    resetRouter()
    // 删除权限中的动态路由,传入空数组
    context.commit('permission/setRoutes', [], { root: true })
  }


}
const getters = {

}
export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
}

